前言
某次业务上线常规安全测试,有记录操作的功能,猜测存在存储型XSS漏洞,但由于存在长亭WAF被拦截。遂将之前总结的XSS绕过手段逐一测试了下。
0x01 绕过记录
首先尝试生僻标签绕过,拦截
|
|
利用伪协议,拦截
|
|
添加标签属性进行混淆,比如xmlns属性,拦截
|
|
利用字符串拼接
使用top对象,拦截
top可以连接对象以及属性或函数
|
|
尝试更换函数,拦截
|
|
尝试编码绕过函数黑名单,比如url编码,拦截
|
|
也可尝试其他编码,再尝试前可以先看看eval是否可用
|
|
eval也拦截,尝试将eval进行编码混淆,拦截
|
|
编码尝试了URL编码、Unicode编码、Base64编码、JS8编码、JS16编码、Ascii编码等,当然如果eval可以还可执行外部JS代码,但仍全部拦截。
|
|
尝试windows对象,拦截
|
|
尝试利用赋值
|
|
还是拦截,加点混淆
|
|
仍旧拦截,再变形下
|
|
仍然拦截,变态啊!
尝试利用join函数,拦截
join函数将数组转换成字符串,可以将一些关键字作为数组,再用join连接,转化成字符串
|
|
尝试利用concat函数
concat函数可以用于连接两个或多个数组,还可以合并两个或者多个字符串。
|
|
苍天不负,终于不拦截了!
将代码插入业务
愉快的刷新页面,但是并没有弹窗,发现被实体编码了。
原来测试这么久测试了个寂寞,艹。
0x02 技巧整理
1. 拼接
拼接函数:
|
|
比如:
|
|
2. 编码
常见的编码类型:URL编码、base64编码、Hex编码、JS8编码、JS16编码、Unicode编码、html编码
既然是编码肯定需要一些函数来执行,比如:eval,setTimeout,setInterval,constructor,execScript(IE)等
|
|
3. 字符串
利用正则表达式返回字符串
|
|
利用toString转换字符串。
整数toString(radix)
转字符串, 第一个点表示浮点数,第二个点表示调用函数
|
|
alert
字符串用parseInt
函数,以基数为30转化后为8680439
parseInt('alert',30) == 8680439
toString
函数将返回的数字8680439,以基数为30还原
8680439..toString(30) == alert
4. 函数多样调用
|
|
5. 利用数组等的功能函数
|
|
利用拼接数组函数
concat()
不仅仅可以用于连接两个或多个数组,还可以合并两个或者多个字符串
|
|
再补充个有些防护过滤了document.cookie
可以试下下面的,很爽的
|
|
join()
将数组转换成字符串
|
|
6. 新建函数
|
|
7. location
location
对象的hash
属性用于设置或取得 URL 中的锚部分,比如:http://localhost/1.php#alert(1)
,我们在控制台输入location.hash
,则会返回我们设定的锚
,即#alert(1)
。
再结合slice()
、substr()
等字符串处理函数获取字符串
|
|
同样的道理location.search
也类似,它可以把部分参数放在?
之后
|
|
再比如:
|
|
9. 伪协议
常见的伪协议有:javascript:
,vbscript:
(IE下),data:
|
|
10. unescape
unescape()
函数用于对已经使用escape()
函数编码的字符串进行解码,并返回解码后的字符串。
很多会拦截外部url
,比如拦截//
|
|
11. with
with
用来引用某个特定对象中已有的属性,使用with可以实现通过节点名称的对象调用。
如果.
被拦截,可以使用with
替代。
|
|
基于DOM的方法创建和插入节点把外部JS文件注入到网页中,也可以应用with。
|
|
12. 过滤括号
|
|
13. 引用外部url
创建和插入节点把外部JS文件注入到网页
|
|
14. 赋值
|
|
15. 黑名单
以alert(1)
为例
|
|
16. 标签
16.1. body
|
|
16.2. 其他
|
|
太多了,再次提醒大家好好看看这个网站:
https://portswigger.net/web-security/cross-site-scripting/cheat-sheet
17. 事件捕获
|
|
18. 属性
|
|